import arbori.ArboreFunctional;
import arbori.Nod;
import functii.*;
import operatori.*;
import visitor.*;

public class Main {
	public static void main(String args[])
	{
		Nod plus=new Plus();//reprezentarea functiei x+3
		Nod xn=new Necunoscuta();
		Nod ct=new Constanta(3);
		
		plus.setFStang(xn);
		plus.setFDrept(ct);
		
		ArboreFunctional a=new ArboreFunctional(plus);
        Visitor v=new ToStringVisitor();
        Visitor v1=new DerivareVisitor();
        a.acceptVisitor(v);
        a.acceptVisitor(v1);
        System.out.println("Functia este: "+((ToStringVisitor)v).getS());
        System.out.println("Derivata functiei este: "+((DerivareVisitor)v1).getRezultat());
        
        
        //////////////////////////////////
		Nod produs=new Produs();//reprezentarea functiei x*3
		Nod xn1=new Necunoscuta();
		Nod ct1=new Constanta(3);
		
		produs.setFStang(xn1);
		produs.setFDrept(ct1);
		
		ArboreFunctional a1=new ArboreFunctional(produs);
        Visitor v2=new ToStringVisitor();
        Visitor v3=new DerivareVisitor();
        a1.acceptVisitor(v2);
        a1.acceptVisitor(v3);
        System.out.println("Functia este: "+((ToStringVisitor)v2).getS());
        System.out.println("Derivata functiei este: "+((DerivareVisitor)v3).getRezultat());
        
/////////////////////////////////////////////////        
		Nod sin=new Sin();//reprezentarea functiei sin(x)
		Nod xn2=new Necunoscuta();
		//Nod ct2=new Constanta(3);
		
		sin.setFStang(xn2);
		//produs.setFDrept(ct2);
		
		ArboreFunctional a2=new ArboreFunctional(sin);
        Visitor v4=new ToStringVisitor();
        Visitor v5=new DerivareVisitor();
        a2.acceptVisitor(v4);
        a2.acceptVisitor(v5);
        System.out.println("Functia este: "+((ToStringVisitor)v4).getS());
        System.out.println("Derivata functiei este: "+((DerivareVisitor)v5).getRezultat());
       	
	}

}